package com.weixin.project.Util;

import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.JSONValidator;
import com.weixin.project.Common.Exception.JSONParseException;
import com.weixin.project.Common.Exception.JSONSchemaNotMatchException;
import org.everit.json.schema.Schema;
import org.everit.json.schema.ValidationException;
import org.everit.json.schema.loader.SchemaLoader;
import org.json.JSONTokener;

import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class JSONUtil {
    /**
     * 检查是否满足json文件格式
     * @param jsonStr json字符串
     */
    public static void validateJSONFile(String jsonStr){
        JSONValidator validator = JSONValidator.from(jsonStr);
        if (!validator.validate()) {
            throw new JSONParseException();
        }
    }

//    /**
//     * 将文件转化为一个JSONObject供后续处理
//     * @param filePath json文件在服务器中的真实路径
//     * @return JSONObject
//     */
//    public static JSONObject transFile2JSON(String filePath){
//        try {
//            String str =  FileUtil.file2String(filePath);
//            JSONObject obj = JSONObject.parseObject(str);
//            System.out.println(obj);
//            return obj;
//        } catch (Exception e){
//            throw new JSONParseException();
//        }
//    }

    /**
     * 检验是否满足规定的json schema
     * @param obj com.alibaba.fastjson.JSONObject
     * @return true/false
     */
    public static void checkSchemaOfJSON(JSONObject obj) {
        try {
            // 加载JSON Schema
            InputStream schemaInputStream = JSONUtil.class.getClassLoader().getResourceAsStream("static/schema.json");
            org.json.JSONObject rawSchema = new org.json.JSONObject(new JSONTokener(schemaInputStream));
            Schema schema = SchemaLoader.load(rawSchema);

            // 验证JSON数据
            schema.validate(new org.json.JSONObject(obj.toJSONString()));
        } catch (ValidationException e) {
            throw new JSONSchemaNotMatchException();
        }
    }

}
